#include <stdio.h>
#include <stdlib.h>
#include <libexif/exif-data.h>
#include <libexif/exif-entry.h>

void write_stabilization_data(const char *filename, const char *stabilization_data) {
    ExifData *ed;
    ExifEntry *entry;

    // 读取现有的 EXIF 数据
    ed = exif_data_new_from_file(filename);
    if (!ed) {
        fprintf(stderr, "No EXIF data found in file %s\n", filename);
        return;
    }

    // 创建一个新的 EXIF 条目
    entry = exif_entry_new();
    if (!entry) {
        fprintf(stderr, "Failed to create new EXIF entry\n");
        exif_data_unref(ed);
        return;
    }

    // 设置条目的标签和类型
    entry->tag = EXIF_TAG_USER_COMMENT; // 使用用户评论标签
    entry->format = EXIF_FORMAT_UNDEFINED;
    entry->components = strlen(stabilization_data) + 1; // +1 for null terminator

    // 分配内存并复制数据
    entry->data = (unsigned char *)malloc(entry->components);
    if (!entry->data) {
        fprintf(stderr, "Failed to allocate memory for EXIF entry data\n");
        exif_entry_unref(entry);
        exif_data_unref(ed);
        return;
    }
    memcpy(entry->data, stabilization_data, entry->components);

    // 将条目添加到 EXIF 数据中
    exif_data_set_entry(ed, entry);

    // 写入修改后的 EXIF 数据到文件
    if (exif_data_save_data(ed, filename) < 0) {
        fprintf(stderr, "Failed to save EXIF data to file %s\n", filename);
    }

    // 清理
    exif_entry_unref(entry);
    exif_data_unref(ed);
}

int main(int argc, char *argv[]) {
    if (argc != 3) {
        fprintf(stderr, "Usage: %s <image.jpg> <stabilization_data>\n", argv[0]);
        return 1;
    }

    write_stabilization_data(argv[1], argv[2]);
    return 0;
} 


/*

sudo apt-get install libexif-dev
gcc exif_write_stabilization.c -o exif_write_stabilization -lexif

./exif_write_stabilization image.jpg "电子防抖数据"


除了 EXIF_TAG_USER_COMMENT，您还可以考虑以下 EXIF 标签来存储电子防抖数据：
1. EXIF_TAG_USER_DATA
    描述: 该标签用于存储用户自定义数据，适合存储额外的元数据。
    大小: 通常建议的大小限制为 255 字节。
2. EXIF_TAG_IMAGE_DESCRIPTION
    描述: 该标签用于描述图像的内容，可以用来存储电子防抖的相关信息。
    大小: 该标签的大小也通常限制在 255 字节。
3. EXIF_TAG_MAKER_NOTE
    描述: 该标签用于存储相机制造商的特定信息，通常用于存储与相机相关的附加数据。
    大小: 该标签的大小没有严格限制，但通常会受到相机制造商的实现限制。
4. EXIF_TAG_SOFTWARE
    描述: 该标签用于记录图像处理软件的信息，可以用来存储处理图像时的电子防抖信息。
    大小: 通常建议的大小限制为 255 字节。
5. 自定义标签
    描述: 如果您有特定的需求，可以考虑使用未分配的 EXIF 标签（如 EXIF_TAG_UNKNOWN）来存储电子防抖数据。
    大小: 这取决于您选择的标签和实现。

*/